export default class SocketService{
    /**
     * 单例模式
     */

    static instance = null;
    // 保证所有客户端获取的都是同一个对象
    static get Instance(){
        if(!this.instance){
            this.instance = new SocketService();
        }

        return this.instance;
    }

    // 和服务器连接的socket对象
    ws = null;

    callBackMapping = {}

    // 定义一个连接服务器的方法
    connect(){
        // 连接服务器
        if(!window.WebSocket){
            alert("您的浏览器不支持websocket");
            return;
        }

        this.ws = new WebSocket("ws://localhost:9998");

        // 连接成功的事件
        this.ws.onopen = () => {
            console.log("连接服务端成功了");
        }

        // 连接服务端失败
        this.ws.onclose = () => {
            console.log("连接服务端失败");
        }

        // 得到服务端发送过来的数据
        this.ws.onmessage = msg => {
            console.log("从服务端获取到了数据");
            // 真正服务端发送过来的数据是在msg中的data字段
            console.log(msg.data);


            const recvData = JSON.parse(msg.data);
            const socketType = recvData.socketType;

            // 判断回调函数是否存在
            if(this.callBackMapping[socketType]){
                const action = recvData.action;
                if(action == "getData"){
                    const realData = JSON.parse(recvData.data);
                    this.callBackMapping[socketType].call(this,realData);
                }else if(action == "fullScreen"){
                    this.callBackMapping[socketType].call(this,recvData);
                }else if(action == "themeChange"){

                }
            }
        }
    }

    // 回调函数的注册
    registerCallback(socketType, callBack){
        this.callBackMapping[socketType] = callBack;
    }

    // 某一个回调函数的取消
    unRegisterCallback(socketType){
        this.callBackMapping[socketType] = null;
    }

    // 发送数据的方法
    send(data){
        const timerId = setInterval(()=>{
            // 如果websocket服务器连接状态为OPEN, 则进行发送
            if(this.ws.readyState == 1){
                this.ws.send(JSON.stringify(data));
                clearInterval(timerId);
                return;
            }
        });
    }
}